import { _decorator, Component, Node, Label, Animation } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('Game')
export class Game extends Component {
    @property({ type: Node })
    private enemyAreaNode: Node = null!; // 敌人enemyArea节点
    @property({ type: Label })
    private enemyHpLabel: Label = null!; // 敌人enemy节点下的hp节点下的label
    @property({ type: Label })
    private playerHpLabel: Label = null!; // 玩家hp 节点下的label
    @property({ type: Label })
    private playerApLabel: Label = null!; // 玩家ap 节点下的label
    @property({ type: Label })
    private playerMpLabel: Label = null!; // 玩家mp 节点下的label

    @property({ type: Node })
    private nextBtnNode: Node = null!; // 绑定nextBtn节点

    @property({ type: Animation })
    private bgAnim: Animation = null!; // 绑定bg的动画组件节点

    private playerMaxHp: number = 25; // 玩家最大血量
    private playerMaxAp: number = 3; // 玩家最大行动值
    private playerMaxMp: number = 10; // 玩家最大魔法值
    private playerAttack: number = 5; // 玩家攻击力

    private enemyMaxHp: number = 25; // 敌人最大血量
    private enemyAttack: number = 2; // 敌人攻击力

    private healMpCost: number = 4; // 治疗术法力消耗
    private healHp: number = 5; // 治疗术恢复量
    private increaseMp: number = 2; // 法力恢复速度

    private playerHp: number = 0; // 玩家当前血量
    private playerMp: number = 0; // 玩家当前法力值
    private playerAp: number = 0; // 玩家当前行动力

    private enemyHp: number = 0; // 敌人当前血量

    private isPlayerTurn: Boolean = true; // 是否玩家的回合 true-玩家回合 false-敌人回合

    private enemyAnim: Animation = null!; // 敌人动画组件

    protected onLoad(): void {
        this.enemyAnim = this.enemyAreaNode.getComponent(Animation); // 绑定敌人动画组件节点
    }

    start() {
        this.initEnemy();
        this.initPlayer();

        // 敌人攻击动画结束后，攻防转换,玩家才可以攻击，防止敌人动画还没结束，玩家就可以攻击
        this.enemyAnim.on(
            Animation.EventType.FINISHED,
            () => {
                this.isPlayerTurn = true;
            },
            this
        );

        this.bgAnim.on(Animation.EventType.FINISHED, this.bgAnimFinish, this); // 绑定背景动画结束事件
    }

    update(deltaTime: number) {}

    // 背景动画完成的回调函数
    bgAnimFinish() {
        this.initEnemy();
        this.isPlayerTurn = true;
        this.updatePlayerAp(this.playerMaxAp);
    }

    // 初始玩家
    initPlayer() {
        this.updatePlayerHp(this.playerMaxHp); // 更新玩家最大生命
        this.updatePlayerAp(this.playerMaxAp); // 更新玩家最大行动力
        this.updatePlayerMp(this.playerMaxMp); // 更新玩家最大法力
    }
    // 初始化敌人
    initEnemy() {
        this.updateEnemyHp(this.enemyMaxHp); // 更新敌人最大生命值
        this.enemyAreaNode.active = true; // 激活敌人节点，显示
    }

    // 更新敌人hp
    updateEnemyHp(hp: number) {
        this.enemyHp = hp;
        this.enemyHpLabel.string = `${this.enemyHp}hp`;
    }

    // 更新玩家hp
    updatePlayerHp(hp: number) {
        this.playerHp = hp;
        this.playerHpLabel.string = `HP\n${this.playerHp}`;
    }
    // 更新玩家ap
    updatePlayerAp(ap: number) {
        this.playerAp = ap;
        this.playerApLabel.string = `AP\n${this.playerAp}`;
    }
    // 更新玩家mp
    updatePlayerMp(mp: number) {
        this.playerMp = mp;
        this.playerMpLabel.string = `MP\n${this.playerMp}`;
    }

    // 玩家攻击
    handlePlayerAttack() {

        if (!this.isPlayerTurn) return; // 非玩家回合

        // 玩家没有行动值不可以行动
        if (this.playerAp <= 0) return;

        // 消耗行动值
        this.playerAp -= 1;

        // 法力值恢复一次,但是不能超过最大值

        this.playerMp + this.increaseMp <= this.playerMaxMp ? (this.playerMp += this.increaseMp) : this.playerMaxMp;

        // 玩家攻击敌人，敌人受到攻击的动画
        this.playEnemyAnim();

        // 敌人受到攻击
        this.enemyBeAttack();

        // 更新玩家ap
        this.updatePlayerAp(this.playerAp);

        // 更新玩家mp
        this.updatePlayerMp(this.playerMp);

        // 攻防回合转化
        this.handleSwitchTurn();
    }

    // 玩家被攻击
    playerBeAttack() {
        this.playerHp -= this.enemyAttack;
        this.updatePlayerHp(this.playerHp);

        // 播放怪物攻击玩家的动画
        this.playEnemyAnim(1);

        if (this.playerHp <= 0) {
            console.log('玩家死亡，游戏结束');
            return;
        }

        // 玩家没有死亡,开始新一轮的攻击
        this.isPlayerTurn = true;
        this.updatePlayerAp(this.playerMaxAp); // 恢复行动力 - 这里恢复满
    }

    // 敌人被攻击
    enemyBeAttack() {
        this.enemyHp -= this.playerAttack;

        if (this.enemyHp <= 0) {
            this.enemyDie();
            return false;
        }

        this.updateEnemyHp(this.enemyHp);
    }
    // 播放敌人动画 [0-被攻击 1-主动攻击]
    playEnemyAnim(type: number = 0) {
        if (type === 1) {
            this.enemyAnim.play('enemyAttack');
        } else {
            this.enemyAnim.play('hurt');
        }
    }

    // 敌人死亡
    enemyDie() {
        this.enemyAreaNode.active = false; // 隐藏怪物
        this.nextBtnNode.active = true; // 显示下一层按钮
        this.isPlayerTurn = false; // 非玩家回合

    }

    nextLevel() {
        // 停止敌人的动画
        this.enemyAnim.stop();

        // 下一层转场动画
        this.bgAnim.play('interlude');

        this.nextBtnNode.active = false; // 隐藏下一层按钮

        this.isPlayerTurn = true; // 新关卡 - 玩家先攻
    }

    // 攻防回合转换检查
    handleSwitchTurn() {
        // 如果敌人还没死 && 玩家没有行动力了 就切换到敌人的回合
        if (this.playerAp <= 0) {
            this.isPlayerTurn = !this.isPlayerTurn;
            this.handleEnemyAttack();
        }
    }
    // 敌人攻击
    handleEnemyAttack() {
        if (this.isPlayerTurn) return; // 玩家回合不能攻击
        this.playerBeAttack();
    }

    // 治疗术
    handleIatrotechnics(){
        if(!this.isPlayerTurn) return; // 非玩家回合不能使用
        // 玩家没有行动点 return
        if(this.playerAp <=0) return;
        // 玩家当前法力不足以使用治疗术则return
        if(this.playerMp < this.healMpCost) return;

        // 使用治疗会消耗行动值和法力
        this.playerAp -= 1;
        this.updatePlayerAp(this.playerAp);

        this.playerMp -= this.healMpCost;
        this.updatePlayerMp(this.playerMp);

        // 增加血量,不能超过玩家最大血量
        (this.playerHp + this.healHp) >= this.playerMaxHp?this.playerHp = this.playerMaxHp:this.playerHp+=this.healHp;
        
        this.updatePlayerHp(this.playerHp);


        this.handleSwitchTurn()
        


    }
}
